package com.dak.robot;

import com.dak.robot.Service.AdminService;
import com.dak.robot.Service.GroupMessageService;
import com.dak.robot.Service.ListenedGroupService;
import com.dak.robot.Service.ListenedService;
import net.mamoe.mirai.Bot;
import net.mamoe.mirai.BotFactory;
import net.mamoe.mirai.event.events.GroupMessageEvent;
import net.mamoe.mirai.message.data.At;
import net.mamoe.mirai.message.data.MessageChain;
import net.mamoe.mirai.message.data.MessageChainBuilder;
import net.mamoe.mirai.utils.BotConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import java.util.List;

/**
测试01：805146696
测试02：519159293
*/

/**
 * 开发进度：
 * 2021/2/26：
 * 已完成：
 * 1、用户监听表listened的增删查已经完成，测试后无问题。
 * 2、群组监听表listenedgroup的增删查已经完成，测试后无问题。
 * 2021/2/27：
 * 1、管理员表admin的增删查完成，权限判断逻辑完成，测试后无问题。
 * 2、消息表groupmessage增删查完成，消息存储功能完成，测试后无问题。
 * 3、图片表image增删查完成，图片存储功能完成，测试后无问题。
 * 2021/2/28：
 * 1、优化了消息存储部分代码，去掉了冗余，将主类中功能部分代码移动到GroupMessageService中。
 * 2、合并了ImageService和GroupMessageService的功能，减少冗余。
 * 3、消息读取的指令解析部分未完成，数据库操作部分还未测试。
 * 2021/3/10:
 * 1、重新设计了指令解析部分的代码
 * 2、修改了代码中错误的函数调用
 * 3、修改了GrouMessageDao.xml中的错误，select方法可以正常工作，经过测试后，未出现问题
 * 4、完成了根据sender_id和group_id从groupmessage表中读取String类型的Json数据，列名为data，读取出来作为List<String>使用，通过foreach循环反序列化，并添加到MessageChainBuilder中
 * 2021/3/11:
 * 1、完成读取出来的消息的解析，根据groupmessage表中，data字段中的ImageId，从image表中读取图片并添加到MessageChainBuilder中，最后build成MessageChain交给机器人发送
 * PS:这一部分的读取操作和解析消息操作，可以在web部分的后端进行使用！！！！
 * 2、从数据库中读取消息并解析、组装为MessageChain的代码部分，移动到GroupMessageService中实现，减少主函数中代码量
 * 3、删除群聊记录指令完成：1、根据sender_id或group_id删除指定范围聊天记录
 *                      2、根据指定消息id删除指定id记录(消息id和发送时间在查询群聊天记录时会进行显示)
 *                      删除功能经测试完成，无问题
 * PS:就存储而言，图片转为二进制byte[]数据存入数据库中，如果不做特殊剪切处理，字段属性若为blob，则很容易出现图片过大，超出存储限制
 * 进而出现MySql的Blob字段报错："Data truncation: Data too long for column 'CONTENT' at row 1"
 * 解决方法：1、对图片进行特殊处理，确保存储时容量足够
 *         2、将表中字段属性从blob变为longblob
 *         此处采用第二种方法解决，因为比较简单。
 * TODO:目前通过QQ机器人，在指定的群聊中完成的操作功能，基本实现，剩下的只要在web部分进行实现设计。     后期也有可能返回来进行一些功能指令的添加！
 * 2021/3/11:
 * 1、因为用java开发，所以和springboot一起打包时出现问题、
 * 2、通过浏览github中项目的issues找到了解决方法
 * 3、根据解决方法修改依赖项之后，发现缺少kotlinx.coroutines依赖。解决方法：添加此依赖项
 * PS:kotlinx.coroutines依赖项必须要是适合的版本！！！比如2.4.2的核心，无法使用1.3.3的版本，会报错。而使用1.4.3版本可以正常运行！！
 */
@SpringBootApplication
public class RobotApplication {
/*    @Resource
    private static ListenedController listenedController;*/

    public static void main(String[] args) {
       ApplicationContext applicationContext = SpringApplication.run(RobotApplication.class, args);
        /**
         * ListenedService：对用户监听表listened进行操作
         * ListenedGroupService：对群组监听表listenedgroup进行操作
         * GroupMessageService：对群组消息表group_message进行操作
         */
        ListenedService listenedService = applicationContext.getBean(ListenedService.class);
        ListenedGroupService listenedGroupService = applicationContext.getBean(ListenedGroupService.class);
        GroupMessageService groupMessageService = applicationContext.getBean(GroupMessageService.class);
        AdminService adminService = applicationContext.getBean(AdminService.class);

        Bot bot = BotFactory.INSTANCE.newBot(1703534903L,"fly19990303sky",new BotConfiguration(){{
            fileBasedDeviceInfo("dev.json");
            setProtocol(MiraiProtocol.ANDROID_PAD);
        }});
        bot.login();

        bot.getEventChannel().subscribeAlways(GroupMessageEvent.class, it -> {
            /**
             * 监听并解析、执行指令部分
             * 判断消息所属群组，若归属于指定：群号码为519159293群组中，则判断为指令
             * 解析指令并执行：1、#添加用户：XXX
             *              2、#删除用户：XXX
             *              3、#用户列表
             *              4、#添加群组：XXX
             *              5、#删除群组：XXX
             *              6、#群组列表
             *              7、#help------------------------显示上述指令到聊天框
             */
            if ((listenedGroupService.checkInOrNotForGroup(it.getGroup().getId()) || it.getGroup().getId() == 519159293L)){
                String order = it.getMessage().get(1).toString();
                boolean adminpermission = (adminService.checkInOrNotForAdmin(it.getSender().getId()) || it.getSender().getId() == 854592455L);
                if (order.startsWith("#指令：添加用户：") && adminpermission){
                    Long qqid = Long.parseLong(order.replaceAll("[^0-9]",""));
                    try{
                        listenedService.insertUser(qqid);
                    }
                    catch (Exception e){
                        ;
                    }

                }
                else if (order.startsWith("#指令：删除用户：") && adminpermission){
                    Long qqid = Long.parseLong(order.replaceAll("[^0-9]",""));
                    listenedService.deleteUser(qqid);
                }
                else if (order.startsWith("#指令：用户列表") && adminpermission){
                    List<Long> userList = listenedService.selectAllUser();
                    StringBuilder stringBuilder = new StringBuilder();
                    userList.forEach(item->{
                        stringBuilder.append(item.toString() + "\n");
                    });
                    MessageChain messages = new MessageChainBuilder().append(stringBuilder).build();

                    /**
                     * 用户列表可能为空
                     * 利用try{}catch(){}进行异常处理输出指定的提示信息
                     */

                    try{
                        bot.getGroupOrFail(519159293L).sendMessage(messages);
                    }
                    catch (Exception e){
                        bot.getGroupOrFail(519159293L).sendMessage("用户列表为空！");
                    }

                }
                else if (order.startsWith("#指令：添加群组：") && adminpermission){
                    Long group_id = Long.parseLong(order.replaceAll("[^0-9]",""));
                    try {
                        listenedGroupService.insertGroup(group_id);
                    }
                    catch (Exception e){
                        ;
                    }

                }
                else if (order.startsWith("#指令：删除群组：") && adminpermission){
                    Long group_id = Long.parseLong(order.replaceAll("[^0-9]",""));
                    listenedGroupService.deleteGroup(group_id);
                }
                else if (order.startsWith("#指令：群组列表") && adminpermission){
                    List<Long> grouplist = listenedGroupService.selectAllGroup();
                    StringBuilder stringBuilder = new StringBuilder();
                    grouplist.forEach(item->{
                        stringBuilder.append(item.toString() + "\n");
                    });
                    MessageChain messages = new MessageChainBuilder().append(stringBuilder).build();

                    /**
                     * listenedgroup表可能为空，所以需要获取异常并输出特定信息。
                     */

                    try{
                        bot.getGroupOrFail(519159293L).sendMessage(messages);
                    }
                    catch (Exception e){
                        bot.getGroupOrFail(519159293L).sendMessage("群组列表为空！");
                    }

                }
                else if (order.startsWith("#指令：帮助") && adminpermission){
                    StringBuilder stringBuilder = new StringBuilder();
                    if (it.getSender().getId() == 854592455L){
                        stringBuilder.append("1、#指令：添加用户：XXX"+"\n"+"2、#指令：删除用户：XXX"+"\n"+"3、#指令：用户列表"+"\n"+"4、#指令：添加群组：XXX"+"\n"+"5、#指令：删除群组：XXX"+"\n"+"6、#指令：群组列表"+"\n"+"7、#指令：添加管理员：XXX"+"\n"+"8、#指令：删除管理员：XXX"+"\n"+"9、#指令：管理员列表"+"\n"+"10、#指令：查询群聊记录：QQ：XXX，群：XXX"+"\n"+"11、#指令：删除指定id记录：XXX"+"\n"+"12、#指令：删除群聊记录：QQ：XXX，群：XXX");
                    }
                    else {
                        stringBuilder.append("1、#指令：添加用户：XXX"+"\n"+"2、#指令：删除用户：XXX"+"\n"+"3、#指令：用户列表"+"\n"+"4、#指令：添加群组：XXX"+"\n"+"5、#指令：删除群组：XXX"+"\n"+"6、#指令：群组列表"+"\n"+"7、#指令：查询群聊记录：QQ：XXX，群：XXX"+"\n"+"8、#指令：删除指定id记录：XXX"+"\n"+"9、#指令：删除群聊记录：QQ：XXX，群：XXX");
                    }
                    MessageChain messages = new MessageChainBuilder().append(stringBuilder).build();
                    bot.getGroupOrFail(519159293L).sendMessage(messages);
                }
                else if (order.startsWith("#指令：添加管理员：") && it.getSender().getId() == 854592455L){
                    long qqid = Long.parseLong(order.replaceAll("[^0-9]",""));
                    try {
                        adminService.insertAdmin(qqid);
                    }
                    catch (Exception e){
                        ;
                    }
                }
                else if (order.startsWith("#指令：删除管理员：") && it.getSender().getId() == 854592455L){
                    long qqid = Long.parseLong(order.replaceAll("[^0-9]",""));;
                    adminService.deleteByAdminId(qqid);
                }
                else if (order.startsWith("#指令：管理员列表") && it.getSender().getId() == 854592455L){
                    List<Long> adminlist = adminService.selectAllAdmin();
                    MessageChainBuilder messageChainBuilder = new MessageChainBuilder();
                    adminlist.forEach(item->{
                        messageChainBuilder.append(item.toString()).append("\n");
                    });
                    MessageChain messages = messageChainBuilder.build();
                    try {
                        bot.getGroupOrFail(519159293L).sendMessage(messages);
                    }
                    catch (Exception e){
                        bot.getGroupOrFail(519159293L).sendMessage("管理员列表为空！");
                    }
                }
                else if (order.startsWith("#指令：查询群聊记录：") && adminpermission){
                    /**
                     * 变量str是String数组，存储以"，"分割开的字符串
                     * 用于进行指令参数判断
                     */
                    String[] str = order.split("，");
                    Long sender_id = Long.valueOf(-1);
                    Long group_id = Long.valueOf(-1);
                    for (String s :
                            str) {
                        /**
                         * 因为错误使用String.startswith()方法，所以这一部分功能卡了很久
                         * String.startswith()方法：判断字符串是否以指定的前缀开始。  重点是--“指定的前缀”
                         * String.contains()方法：判断字符串中是否包含指定的字符串序列。   重点是--“是否包含”
                         */
                        if (s.contains("QQ：")){
                            sender_id = Long.valueOf(s.replaceAll("[^0-9]",""));
                        }
                        if (s.contains("群：")){
                            group_id = Long.valueOf(s.replaceAll("[^0-9]",""));
                        }
                    }
                    if (sender_id == -1 && group_id == -1){
                        bot.getGroupOrFail(519159293L).sendMessage("指令格式或参数有误！");
                    }
                    else {
                        /**
                         * 消息的读取和解析
                         * 具体实现步骤放在GroupMessageServiceImpl中
                         */
                        try {
                            bot.getGroupOrFail(519159293L).sendMessage(groupMessageService.getGroupMessage(sender_id,group_id));
                        }
                        catch (Exception e){
                            bot.getGroupOrFail(519159293L).sendMessage("无消息记录！");
                        }
                    }
                }
                else if (order.startsWith("#指令：删除群聊记录：") && adminpermission){
                    String[] str = order.split("，");
                    Long sender_id = Long.valueOf(-1);
                    Long group_id = Long.valueOf(-1);
                    for (String s :
                            str) {
                        if (s.contains("QQ：")){
                            sender_id = Long.valueOf(s.replaceAll("[^0-9]",""));
                        }
                        if (s.contains("群：")){
                            group_id = Long.valueOf(s.replaceAll("[^0-9]",""));
                        }
                    }
                    groupMessageService.deleteGroupMessage(sender_id,group_id);
                }
                else if (order.startsWith("#指令：删除指定id记录：") && adminpermission){
                    Long id = Long.valueOf(order.replaceAll("[^0-9]",""));
                    groupMessageService.delectGroupMessage(id);
                }
                /**
                 * 无权限用户发送指令后机器人提示
                 */
                else if (order.startsWith("#指令：") && adminpermission == false){
                    At at = new At(it.getSender().getId());
                    MessageChain messages = new MessageChainBuilder().append(at).append("，你没有权限！").build();
                    bot.getGroupOrFail(it.getGroup().getId()).sendMessage(messages);
                }
                /**
                 * 存储时不区分控制群与普通监听群
                 * 在读取时可以按照群号码和QQ号码进行读取分析，以获得操作记录
                 */
                else {
                    /**
                     * 判断发送群组消息的用户是否存在用户监听表listened中
                     */
                    if (listenedService.checkInOrNotForUser(it.getSender().getId())){
                        groupMessageService.insertGroupMessage(it);
                    }
                }
            }
        });

        bot.join();
    }
}


